﻿	/*
	 * Translated default messages for the jQuery validation plugin.
	 * Locale: CN
	 */
	jQuery.extend(jQuery.validator.messages, {
			required: "必填",
			remote: "请修正该字段",
			email: "请输入正确格式的电子邮件",
			url: "请输入合法的网址",
			date: "请输入合法的日期",
			dateISO: "请输入合法的日期 (ISO).",
			number: "请输入合法的数字",
			digits: "只能输入整数",
			creditcard: "请输入合法的信用卡号",
			equalTo: "请再次输入相同的值",
			accept: "请输入拥有合法后缀名的字符串",
			maxlength: jQuery.validator.format("字数最多不超过{0}个"),
			minlength: jQuery.validator.format("字数最少不少于{0}个"),
			rangelength: jQuery.validator.format("字数范围为{0}~{1} 个"),
			range: jQuery.validator.format("请输入一个介于 {0} 和 {1} 之间的值"),
			max: jQuery.validator.format("请输入一个最大为 {0} 的值"),
			min: jQuery.validator.format("请输入一个最小为 {0} 的值")
	});

    //验证两个输入框的值不能相同
    jQuery.validator.addMethod("notEqualTo", function(value, element, param) {
        // bind to the blur event of the target in order to revalidate whenever the target field is updated
        // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
        var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
            $(element).valid();
        });
        return value != target.val();
    }, "值不能相同");


	//自定义正则表达式验证
	jQuery.validator.addMethod("regexpress", function(value, element, param) {    
		var regexp = param;
		return this.optional(element) || regexp.test(value);
	}, "错误的正则表达式");
	
	//半角检测
	jQuery.validator.addMethod("halfangle", function(value, element, param) {    
		var str=value;
	    if (str.length>0)
	    {
	        for (var i = str.length-1; i >= 0; i--)
	        {
	            unicode=str.charCodeAt(i);
	            if (unicode>65280 && unicode<65375 || unicode == 12288)
	            {
	                return false;
	            }
	        }
	    }
	    return true;
	}, "请输入半角字符,按Shift+空格。");
	
	//日期大小比较
	jQuery.validator.addMethod("datecompare", function(value, element, param) {    
    	var d1, d2, day = 24 * 60 * 60 *1000;	
		d1 = value;
		d2 = param;
		try{    
        	var dateArr = d1.split("-");
   			var checkDate = new Date();
        	checkDate.setFullYear(dateArr[0], dateArr[1]-1, dateArr[2]);
   			var checkTime = checkDate.getTime();
  
   			var dateArr2 = d2.split("-");
   			var checkDate2 = new Date();
        	checkDate2.setFullYear(dateArr2[0], dateArr2[1]-1, dateArr2[2]);
   			var checkTime2 = checkDate2.getTime();
    
   			var cha = Math.round((checkTime - checkTime2)/day);  
        	if(cha > 0) 
				return true;
			else
				return false;
		}catch(e){
			return;
		}
	    return true;
	}, "请输入正确的日期。");
	
	//上传文件大小(目前只支持ＩＥ)
	var temp_img = new Image();
	var iparam = 400;
	function CheckProperty( param ) {    
		var imgsize = 0;
		
		if(temp_img.readyState!="complete") //如果图像是未加载完成进行循环检测
		{
			iparam = param;
			setTimeout(function(){CheckProperty(iparam)},500);
			return;
		}
		imgsize = Math.round(temp_img.fileSize/1024*100)/100;
		if(imgsize == undefined) imgsize = 0;
		return (imgsize < param);
	}
	jQuery.validator.addMethod("filesize",function(value, element, param) {  
		var sUserAgent = navigator.userAgent;
		var isOpera = sUserAgent.indexOf("Opera") > -1;
		var isIE = sUserAgent.indexOf("compatible") > -1 && sUserAgent.indexOf("MSIE") > -1 && !isOpera;			   
		if(value.length>0 && isIE){
			temp_img.src = value
			return CheckProperty( param );
		}else{
			return true;
		}
	}, "大小不超过{0}K");
	
	//邮政编码验证
	jQuery.validator.addMethod("isZipCode", function(value, element) {
		var regexp = /^[0-9]{6}$/;
		return this.optional(element) || regexp.test(value);
	}, "请正确填写您的邮政编码");
	
	//手机验证
	jQuery.validator.addMethod("isMobile", function(value, element) {
		var regexp = /^(13[0-9]{1}|15[0-9]{1}|18[0-9]{1}){1}\d{8}$/;
		return this.optional(element) || regexp.test(value);
	}, "请正确填写您的手机号码");
	
	//用户名验证
	jQuery.validator.addMethod("isUserName", function(value, element) {
		var regexp = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]|((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
		return this.optional(element) || regexp.test(value);
	}, "用户名格式错误");
	
	//身份证验证函数
	jQuery.validator.addMethod("isCardCode", function(value, element) {  
        // 身份证验证 15 或　18 位数字
        if(value.length != 15 && value.length != 18) {
	        return this.optional(element);
	    }
	    
	    // 确保前17位每一位都是数字
	    for(i = 0; i < value.length - 1; i++) {
	        // 如何判断一个字母是数字
	        if(isNaN( parseInt( value.charAt(i) ) )) {
	            return this.optional(element);    
	        }
	    }
    
	    // 18 位的确保最后一位是数字或者X
	    var lastIDNum = value.charAt(17);
	    if(value.length == 18 && isNaN(parseInt( value.charAt(i) )) &&  lastIDNum.toLowerCase() != 'x') {
	        return this.optional(element);
	    }
		
		//　判断日期是否正确
		var len = value.length,
			now = new Date(),
			reg;
		if (len == 15)
			reg = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/);
		else if (len == 18)
			reg = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/);
		var a = value.match(reg);
		if (a != null){
			if (len==15){
				var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
				var B = now.getFullYear()>D.getFullYear()&&D.getFullYear()>1900&&D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
			}else{
				var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
				var B = now.getFullYear()>D.getFullYear()&&D.getFullYear()>1900&&D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
			}
			return B;
		}
	    
	    return true;
	}, "请正确填写您的身份证号码");
	
	//电话验证
	jQuery.validator.addMethod("isTelphone", function(value, element) {
		var regexp = /^((00|\+){1}\d{2}-?)?(0\d{2,3}-?)?(\d{7,8})$/;
		return this.optional(element) || regexp.test(value);
	}, "请正确填写您的电话");
	
	//正整数验证
	jQuery.validator.addMethod("isIntege1", function(value, element) {
		var regexp = /^[1-9]\d*$/;
		return this.optional(element) || regexp.test(value);
	}, "请正确填写您的编制，只能填写正整数");
	
	//编号验证
	jQuery.validator.addMethod("myCode", function(value, element) {
		var regexp = /^\w+$/;
		return this.optional(element) || regexp.test(value);
	}, "请正确填写您的编号");
	
	//通用电话号码验证
	jQuery.validator.addMethod("isNumPhone", function(value, element) {
		var regexp = /(^\d{3,4}\-\d{3,8}$)|(^\d{3,4}\-\d{3,8}\-\d{3,8}$)|(^\d{3,4}\-\d{3,8}\-\d{3,8}\-\d{3,8}$)|(^0{0,1}\d{3,11}$)|(^\(\d{3,4}\)\d{3,8}$)|(^0{0,1}1\d{10}$)/;
		return this.optional(element) || regexp.test(value);
	}, "请正确填写您的联系电话");
	
	//数字和英文判断
	jQuery.validator.addMethod("isNumEn", function(value, element) {
		var regexp = /^([0-9A-Za-z])+$/;
		return this.optional(element) || regexp.test(value);
	}, "请输入英文或数字");
	//中文和英文判断
	jQuery.validator.addMethod("isZhEn", function(value, element) {
		var regexp = /^([\u4E00-\uFA29]|[A-Za-z])+$/;
		return this.optional(element) || regexp.test(value);
	}, "请输入英文或中文");
	
	function stripHtml(value) {
		// remove html tags and space chars
		return value.replace(/<.[^<>]*?>/g, ' ').replace(/&nbsp;|&#160;/gi, ' ')
		// remove numbers and punctuation
		.replace(/[0-9.(),;:!?%#$'"_+=\/-]*/g,'');
	}
	jQuery.validator.addMethod("maxWords", function(value, element, params) { 
	    return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length < params; 
	}, jQuery.validator.format("Please enter {0} words or less.")); 
	 
	jQuery.validator.addMethod("minWords", function(value, element, params) { 
	    return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params; 
	}, jQuery.validator.format("Please enter at least {0} words.")); 
	 
	jQuery.validator.addMethod("rangeWords", function(value, element, params) { 
	    return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params[0] && value.match(/bw+b/g).length < params[1]; 
	}, jQuery.validator.format("Please enter between {0} and {1} words."));

	jQuery.validator.addMethod("letterswithbasicpunc", function(value, element) {
		return this.optional(element) || /^[a-z-.,()'\"\s]+$/i.test(value);
	}, "Letters or punctuation only please");  
	
	jQuery.validator.addMethod("alphanumeric", function(value, element) {
		return this.optional(element) || /^\w+$/i.test(value);
	}, "Letters, numbers, spaces or underscores only please");  
	
	jQuery.validator.addMethod("lettersonly", function(value, element) {
		return this.optional(element) || /^[a-z]+$/i.test(value);
	}, "Letters only please"); 
	
	jQuery.validator.addMethod("nowhitespace", function(value, element) {
		return this.optional(element) || /^\S+$/i.test(value);
	}, "No white space please"); 
	
	jQuery.validator.addMethod("ziprange", function(value, element) {
		return this.optional(element) || /^90[2-5]\d\{2}-\d{4}$/.test(value);
	}, "Your ZIP-code must be in the range 902xx-xxxx to 905-xx-xxxx");
	
	jQuery.validator.addMethod("integer", function(value, element) {
		return this.optional(element) || /^-?\d+$/.test(value);
	}, "A positive or negative non-decimal number please");
	
	/**
	* Return true, if the value is a valid vehicle identification number (VIN).
	*
	* Works with all kind of text inputs.
	*
	* @example <input type="text" size="20" name="VehicleID" class="{required:true,vinUS:true}" />
	* @desc Declares a required input element whose value must be a valid vehicle identification number.
	*
	* @name jQuery.validator.methods.vinUS
	* @type Boolean
	* @cat Plugins/Validate/Methods
	*/ 
	jQuery.validator.addMethod(
		"vinUS",
		function(v){
			if (v.length != 17)
				return false;
			var i, n, d, f, cd, cdv;
			var LL    = ["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"];
			var VL    = [1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9];
			var FL    = [8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2];
			var rs    = 0;
			for(i = 0; i < 17; i++){
				f = FL[i];
				d = v.slice(i,i+1);
				if(i == 8){
					cdv = d;
				}
				if(!isNaN(d)){
					d *= f;
				}
				else{
					for(n = 0; n < LL.length; n++){
						if(d.toUpperCase() === LL[n]){
							d = VL[n];
							d *= f;
							if(isNaN(cdv) && n == 8){
								cdv = LL[n];
							}
							break;
						}
					}
				}
				rs += d;
			}
			cd = rs % 11;
			if(cd == 10){cd = "X";}
			if(cd == cdv){return true;}
			return false; 
		},
		"The specified vehicle identification number (VIN) is invalid."
	);
	
	/**
	  * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.
	  *
	  * @example jQuery.validator.methods.date("01/01/1900")
	  * @result true
	  *
	  * @example jQuery.validator.methods.date("01/13/1990")
	  * @result false
	  *
	  * @example jQuery.validator.methods.date("01.01.1900")
	  * @result false
	  *
	  * @example <input name="pippo" class="{dateITA:true}" />
	  * @desc Declares an optional input element whose value must be a valid date.
	  *
	  * @name jQuery.validator.methods.dateITA
	  * @type Boolean
	  * @cat Plugins/Validate/Methods
	  */
	jQuery.validator.addMethod(
		"dateITA",
		function(value, element) {
			var check = false;
			var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
			if( re.test(value)){
				var adata = value.split('/');
				var gg = parseInt(adata[0],10);
				var mm = parseInt(adata[1],10);
				var aaaa = parseInt(adata[2],10);
				var xdata = new Date(aaaa,mm-1,gg);
				if ( ( xdata.getFullYear() == aaaa ) && ( xdata.getMonth () == mm - 1 ) && ( xdata.getDate() == gg ) )
					check = true;
				else
					check = false;
			} else
				check = false;
			return this.optional(element) || check;
		}, 
		"Please enter a correct date"
	);
	
	jQuery.validator.addMethod("dateNL", function(value, element) {
			return this.optional(element) || /^\d\d?[\.\/-]\d\d?[\.\/-]\d\d\d?\d?$/.test(value);
		}, "Vul hier een geldige datum in."
	);
	
	jQuery.validator.addMethod("time", function(value, element) {
			return this.optional(element) || /^([01][0-9])|(2[0123]):([0-5])([0-9])$/.test(value);
		}, "Please enter a valid time, between 00:00 and 23:59"
	);
	
	/**
	 * matches US phone number format 
	 * 
	 * where the area code may not start with 1 and the prefix may not start with 1 
	 * allows '-' or ' ' as a separator and allows parens around area code 
	 * some people may want to put a '1' in front of their number 
	 * 
	 * 1(212)-999-2345
	 * or
	 * 212 999 2344
	 * or
	 * 212-999-0983
	 * 
	 * but not
	 * 111-123-5434
	 * and not
	 * 212 123 4567
	 */
	jQuery.validator.addMethod("phoneUS", function(phone_number, element) {
		phone_number = phone_number.replace(/\s+/g, ""); 
		return this.optional(element) || phone_number.length > 9 &&
			phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
	}, "Please specify a valid phone number");
	
	jQuery.validator.addMethod('phoneUK', function(phone_number, element) {
	return this.optional(element) || phone_number.length > 9 &&
	phone_number.match(/^(\(?(0|\+44)[1-9]{1}\d{1,4}?\)?\s?\d{3,4}\s?\d{3,4})$/);
	}, 'Please specify a valid phone number');
	
	jQuery.validator.addMethod('mobileUK', function(phone_number, element) {
	return this.optional(element) || phone_number.length > 9 &&
	phone_number.match(/^((0|\+44)7(5|6|7|8|9){1}\d{2}\s?\d{6})$/);
	}, 'Please specify a valid mobile number');
	
	// TODO check if value starts with <, otherwise don't try stripping anything
	jQuery.validator.addMethod("strippedminlength", function(value, element, param) {
		return jQuery(value).text().length >= param;
	}, jQuery.validator.format("Please enter at least {0} characters"));
	
	// same as email, but TLD is optional
	jQuery.validator.addMethod("email2", function(value, element, param) {
		return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value); 
	}, jQuery.validator.messages.email);
	
	// same as url, but TLD is optional
	jQuery.validator.addMethod("url2", function(value, element, param) {
		return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); 
	}, jQuery.validator.messages.url);
	
	// NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator
	// Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
	// Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)
	jQuery.validator.addMethod("creditcardtypes", function(value, element, param) {
	
		if (/[^0-9-]+/.test(value)) 
			return false;
		
		value = value.replace(/\D/g, "");
		
		var validTypes = 0x0000;
		
		if (param.mastercard) 
			validTypes |= 0x0001;
		if (param.visa) 
			validTypes |= 0x0002;
		if (param.amex) 
			validTypes |= 0x0004;
		if (param.dinersclub) 
			validTypes |= 0x0008;
		if (param.enroute) 
			validTypes |= 0x0010;
		if (param.discover) 
			validTypes |= 0x0020;
		if (param.jcb) 
			validTypes |= 0x0040;
		if (param.unknown) 
			validTypes |= 0x0080;
		if (param.all) 
			validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
		
		if (validTypes & 0x0001 && /^(51|52|53|54|55)/.test(value)) { //mastercard
			return value.length == 16;
		}
		if (validTypes & 0x0002 && /^(4)/.test(value)) { //visa
			return value.length == 16;
		}
		if (validTypes & 0x0004 && /^(34|37)/.test(value)) { //amex
			return value.length == 15;
		}
		if (validTypes & 0x0008 && /^(300|301|302|303|304|305|36|38)/.test(value)) { //dinersclub
			return value.length == 14;
		}
		if (validTypes & 0x0010 && /^(2014|2149)/.test(value)) { //enroute
			return value.length == 15;
		}
		if (validTypes & 0x0020 && /^(6011)/.test(value)) { //discover
			return value.length == 16;
		}
		if (validTypes & 0x0040 && /^(3)/.test(value)) { //jcb
			return value.length == 16;
		}
		if (validTypes & 0x0040 && /^(2131|1800)/.test(value)) { //jcb
			return value.length == 15;
		}
		if (validTypes & 0x0080) { //unknown
			return true;
		}
		return false;
	}, "Please enter a valid credit card number.");
